/*********************************************************************************
* The contents of this file are subject to the Common Public Attribution
* License Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.openemm.org/cpal1.html. The License is based on the Mozilla
* Public License Version 1.1 but Sections 14 and 15 have been added to cover
* use of software over a computer network and provide for limited attribution
* for the Original Developer. In addition, Exhibit A has been modified to be
* consistent with Exhibit B.
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is OpenEMM.
* The Original Developer is the Initial Developer.
* The Initial Developer of the Original Code is AGNITAS AG. All portions of
* the code written by AGNITAS AG are Copyright (c) 2009 AGNITAS AG. All Rights
* Reserved.
*
* Contributor(s): AGNITAS AG.
********************************************************************************/
package org.agnitas.util;
import org.agnitas.beans.DatasourceDescription;
import org.agnitas.beans.ImportProfile;
import org.agnitas.dao.ImportRecipientsDao;
import org.agnitas.service.impl.DataType;
import org.agnitas.util.importvalues.*;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.mail.ByteArrayDataSource;
import org.apache.commons.mail.MultiPartEmail;
import org.apache.commons.validator.ValidatorResult;
import org.apache.commons.validator.ValidatorResults;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.HibernateTemplate;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author andrew May 12, 2009 2:38:15 PM
*/
public class ImportUtils {
public static final List<String> HIDDEN_COLUMNS = Collections.unmodifiableList(Arrays.asList("customer_id", "change_date", "timestamp", "creation_date", "datasource_id"));
public static final String MAIL_TYPE_HTML = "html";
public static final String MAIL_TYPE_TEXT = "text";
public static final String MAIL_TYPE_TEXT_ALT = "txt";
public static final String MAIL_TYPE_DB_COLUMN = "mailtype";
public static final String MAIL_TYPE_UNDEFINED = "0";
public static final String MAIL_TYPE_DEFINED = "1";
/**
* Retrieves new Datasource-ID for newly imported Subscribers
*
* @param aContext
* @return new Datasource-ID or 0
*/
public static DatasourceDescription getNewDatasourceDescription(int companyID, String description, ApplicationContext aContext) {
HibernateTemplate tmpl = new HibernateTemplate((SessionFactory) aContext.getBean("sessionFactory"));
DatasourceDescription dsDescription = (DatasourceDescription) aContext.getBean("DatasourceDescription");
dsDescription.setId(0);
dsDescription.setCompanyID(companyID);
dsDescription.setSourcegroupID(2);
dsDescription.setCreationDate(new java.util.Date());
dsDescription.setDescription(description);
tmpl.save("DatasourceDescription", dsDescription);
return dsDescription;
}
public static void createTemporaryTable(int adminID, int datasource_id, ImportProfile importProfile, String sessionId, ImportRecipientsDao importRecipientsDao) {
importRecipientsDao.createTemporaryTable(adminID, datasource_id, importProfile.getKeyColumn(), importProfile.getKeyColumns(), importProfile.getCompanyId(), sessionId);
}
public static String describe(ImportProfile importProfile) {
StringBuffer description = new StringBuffer();
try {
final Map beanProperties = BeanUtils.describe(importProfile);
final Set set = beanProperties.keySet();
for (Object keyObject : set) {
final String key = (String) keyObject;
String value = (String) beanProperties.get(key);
if ("checkForDuplicates".equalsIgnoreCase(key)) {
value = CheckForDuplicates.getPublicValue(Integer.parseInt(value));
}
if ("charset".equalsIgnoreCase(key)) {
value = Charset.getValue(Integer.parseInt(value));
}
if ("nullValuesAction".equalsIgnoreCase(key)) {
value = NullValuesAction.getPublicValue(Integer.parseInt(value));
}
if ("importMode".equalsIgnoreCase(key)) {
value = ImportMode.getPublicValue(Integer.parseInt(value));
}
if ("textRecognitionChar".equalsIgnoreCase(key)) {
value = TextRecognitionChar.getValue(Integer.parseInt(value));
}
if ("dateFormat".equalsIgnoreCase(key)) {
value = DateFormat.getValue(Integer.parseInt(value));
}
if ("separator".equalsIgnoreCase(key)) {
value = Separator.getValue(Integer.parseInt(value));
}
if ("adminId".equalsIgnoreCase(key) || "companyId".equalsIgnoreCase(key) || "class".equalsIgnoreCase(key)) {
continue;
}
description.append(key).append(" = \"").append(value).append("\"\n");
}
} catch (Exception e) {
AgnUtils.logger().warn("Can't describe importProfile", e);
}
return description.toString();
}
public static String describeMap(Map reportMap) {
StringBuffer description = new StringBuffer();
final Set set = reportMap.keySet();
for (Object keyObject : set) {
final String key = (String) keyObject;
String value = (String) reportMap.get(key);
description.append(key).append(" = \"").append(value).append("\"\n");
}
return description.toString();
}
public static Boolean checkIsCurrentFieldValid(ValidatorResults results, String propertyName) {
// Get the result of validating the property.
final ValidatorResult result = results.getValidatorResult(propertyName);
// Get all the actions run against the property, and iterate over their names.
if (result == null) {
return true;
}
Map actionMap = result.getActionMap();
for (Object action : actionMap.keySet()) {
String actName = (String) action;
if (!result.isValid(actName)) {
return false;
}
}
return true;
}
public static Boolean checkIsCurrentFieldValid(ValidatorResults results, String propertyName, String actionName) {
// Get the result of validating the property.
final ValidatorResult result = results.getValidatorResult(propertyName);
// Get all the actions run against the property, and iterate over their names.
if (result == null) {
return true;
}
Map actionMap = result.getActionMap();
for (Object action : actionMap.keySet()) {
String actName = (String) action;
if (!result.isValid(actName) && actName.equals(actionName)) {
return false;
}
}
return true;
}
public static Date getDateAsString(String value, int format) {
final SimpleDateFormat dateFormat = new SimpleDateFormat(DateFormat.getValue(format));
Date date = null;
try {
date = dateFormat.parse(value);
} catch (ParseException e) {
AgnUtils.logger().error("Can't parse data", e);
}
return date;
}
public static Object deserialiseBean(byte[] byeRecipient) {
final ByteArrayInputStream f_in = new ByteArrayInputStream(byeRecipient);
ObjectInputStream obj_in;
Object object = null;
try {
obj_in = new ObjectInputStream(f_in);
object = obj_in.readObject();
IOUtils.closeQuietly(obj_in);
} catch (Exception e) {
AgnUtils.logger().error("Can't restore object from bytes", e);
}
return object;
}
public static byte[] getObjectAsBytes(Object recipient) {
byte[] bytes = null;
try {
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(arrayOutputStream);
outputStream.writeObject(recipient);
bytes = arrayOutputStream.toByteArray();
IOUtils.closeQuietly(arrayOutputStream);
} catch (IOException e) {
AgnUtils.logger().error("Can't serialize object", e);
}
return bytes;
}
public static String dbtype2string(int type) {
switch (type) {
case java.sql.Types.BIGINT:
case java.sql.Types.INTEGER:
case java.sql.Types.SMALLINT:
return DataType.INTEGER;
case java.sql.Types.DECIMAL:
case java.sql.Types.DOUBLE:
case java.sql.Types.FLOAT:
case java.sql.Types.NUMERIC:
case java.sql.Types.REAL:
return DataType.DOUBLE;
case java.sql.Types.CHAR:
return DataType.CHAR;
case java.sql.Types.VARCHAR:
case java.sql.Types.LONGVARCHAR:
case java.sql.Types.CLOB:
return DataType.VARCHAR;
case java.sql.Types.DATE:
case java.sql.Types.TIMESTAMP:
case java.sql.Types.TIME:
return DataType.DATE;
}
return "UNKNOWN(" + type + ")";
}
/**
* Some pages have enctype="multipart/form-data" because they need to
* upload file. With such enctype the Charset is corrupted. This method
* fixes strings and make them UTF-8
*
* @param sourceStr source corrupted string
* @return fixed string
*/
public static String fixEncoding(String sourceStr) {
try {
return new String(sourceStr.getBytes("iso-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
AgnUtils.logger().error("Error during encoding converting", e);
return sourceStr;
}
}
/**
* Send email with attachments
*/
public static boolean sendEmailWithAttachments(String from, String to, String subject, String message, EmailAttachment[] attachments) {
return sendEmailWithAttachments(from, to, null, subject, message, attachments);
}
public static boolean sendEmailWithAttachments(String from, String fromName, String to, String subject, String message, EmailAttachment[] attachments) {
boolean result = true;
try {
// Create the email message
MultiPartEmail email = new MultiPartEmail();
email.setCharset("UTF-8");
email.setHostName(AgnUtils.getDefaultValue("system.mail.host"));
email.addTo(to);
if( fromName == null || fromName.equals(""))
email.setFrom(from);
else
email.setFrom( from, fromName);
email.setSubject(subject);
email.setMsg(message);
//bounces and reply forwarded to support@agnitas.de
String replyName = AgnUtils.getDefaultValue( "import.report.replyTo.name");
if( replyName == null || replyName.equals( ""))
email.addReplyTo( AgnUtils.getDefaultValue( "import.report.replyTo.address"));
else
email.addReplyTo( AgnUtils.getDefaultValue( "import.report.replyTo.address"), replyName);
email.setBounceAddress( AgnUtils.getDefaultValue( "import.report.bounce"));
// Create and attach attachments
for (EmailAttachment attachment : attachments) {
ByteArrayDataSource dataSource = new ByteArrayDataSource(attachment.getData(), attachment.getType());
email.attach(dataSource, attachment.getName(), attachment.getDescription());
}
// send the email
email.send();
} catch (Exception e) {
AgnUtils.logger().error("sendEmailAttachment: " + e.getMessage());
result = false;
}
return result;
}
/**
* Checks if request parameters has parameter starting with this string
*
* @param request request
* @param paramStart beginning part of parameter name to check
* @return true if such parameter exists
*/
public static boolean hasParameterStartsWith(HttpServletRequest request, String paramStart) {
Enumeration parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String paramName = (String) parameterNames.nextElement();
if (paramName.startsWith(paramStart)) {
return true;
}
}
return false;
}
public static boolean hasNoEmptyParameterStartsWith(HttpServletRequest request, String paramStart) {
Enumeration parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String paramName = (String) parameterNames.nextElement();
if (paramName.startsWith(paramStart)) {
boolean notEmpty = AgnUtils.parameterNotEmpty(request, paramName);
if(notEmpty){
return true;
}
}
}
return false;
}
/**
* Gets value that is embedded into parameter name
*
* @param request request
* @param parameterStart parameter start string
* @param parameterEnd parameter end string
* @return string from parameter name between parameterStart and parameterEnd
*/
public static String getValueFromParameter(HttpServletRequest request, String parameterStart, String parameterEnd) {
Enumeration parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String paramName = (String) parameterNames.nextElement();
if (paramName.startsWith(parameterStart) && paramName.endsWith(parameterEnd)) {
String rest = paramName.substring(parameterStart.length());
String value = rest.substring(0, rest.length() - parameterEnd.length());
return value;
}
}
return null;
}
public static String getNotEmptyValueFromParameter(HttpServletRequest request, String parameterStart) {
Enumeration parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String paramName = (String) parameterNames.nextElement();
if (paramName.startsWith(parameterStart)) {
if (AgnUtils.parameterNotEmpty(request, paramName)) {
String value = request.getParameter(paramName);
return value;
}
}
}
return null;
}
public static int getBooleanAsInt(boolean extendedEmailCheck) {
return (extendedEmailCheck ? 1 : 0);
}
public static void removeHiddenColumns(Map dbColumns) {
for (String hiddenColumn : HIDDEN_COLUMNS) {
dbColumns.remove(hiddenColumn);
}
}
}